package com.xxx.dynamicproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理类：实现InvocationHandler接口
 */
public class ProxyCompany implements InvocationHandler {
	
	private Object factory;
	
	public Object getFactory() {
		return factory;
	}

	public void setFactory(Object factory) {
		this.factory = factory;
	}
	
	/**
	 * 通过Proxy静态方法getProxyInstance，获取目标类代理对象
	 * @return
	 */
	public Object getProxyInstance() {
		return Proxy.newProxyInstance(factory.getClass().getClassLoader(), factory.getClass().getInterfaces(), this);
	}

	/**
	 * 调用目标类方法
	 */
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		doBefore();  // 前置增强
		Object result = method.invoke(factory, args); // 实际调用的方法
		doAfter(); // 后置增强
		return result;
	}
	
	// 前置增强
	private void doBefore() {
		System.out.println("售前市场调研...");
	}
	
	// 后置增强
	private void doAfter() {
		System.out.println("售后精美包装...");
	}
}
